/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package genericos;

import java.sql.Date;
import genericos.ListaNodos;
import org.joda.time.DateTime;
import basedatos.Seleccion;
/**
 * Clase que se encarga del manejo de fechas.
 *
 * @author Fernando Ramírez Martínez <Servicios Disaster Recovery>
 */
public class ComparadorFechas {

    private DateTime fecha;
    private DateTime estatica;
    static Insercion in=new Insercion();
    static Cambio ca=new Cambio();
    
    public ComparadorFechas(){
        
    }
   
    
    /**
     * Metodo que cambia una fecha java.util a java.sql
     * @param d fecha que se convertira a tipo sqlDate partiendo de un java.util
     * @return la misma feche en Date SQL
     */ 
    public static java.sql.Date pasalo(java.util.Date d) {
       
        DateTime  f=new DateTime(d);
        return new java.sql.Date(f.toDate().getTime());
    }
/**
 * Constructor para la clase
 * @param inicial fecha date de inicio
 * @param fin  fecha date de fin
 */
    public ComparadorFechas(Date inicial, Date fin) {
        fecha = new DateTime(inicial);
        estatica = new DateTime(fin);

    }
/**
 * Constructor para indicar los tiempos entre una fecha con la clase java util
 * @param inicial
 * @param fin 
 */
    public void ponencia(java.util.Date inicial, java.util.Date fin) {
        fecha = new DateTime(inicial);
        estatica = new DateTime(fin);

    }
    public void setfechas(Date inicio,Date fin){
        fecha = new DateTime(inicio);
        estatica = new DateTime(fin);
    }
    /**
     * Metodo que indica mediante un 
     * booleano si la fecha enviada esta entre las fechas destinadas
     * @param f fecha a analizar
     * @return true si esta dentro del periodo, false si no.
     */
    public boolean estadentrode(Date f) {
        DateTime tempo = new DateTime(f);
       /* System.out.println("Fecha comparada " + f);
        System.out.println(estatica.toString());
        System.out.println(fecha.toString());
        System.out.println(estatica.isAfter(tempo));
        System.out.println(fecha.isBefore(tempo));*/
        if (estatica.isAfter(tempo) == true && fecha.isBefore(tempo) == true) {
            return true;
        } else {
            return false;
        }
    }
   /**
    * Metodo que suma los dias necesarios a partir de una fecha dada.
    * @param f fecha de inicio
    * @param dias dias que debera recorrerse
    * @return dia del total en los que se hace la suma.
    */
    public Date suma_diaslaborales(Date f, int dias) {
         
        Date x;
        setFecha(new DateTime(f));
        int i=1;
        do{
            setFecha(getFecha().plusDays(1));
            if(getFecha().getDayOfWeek()==6 || getFecha().getDayOfWeek()==7){
             //   System.out.println("El valor es" +i);
            }
            else{ 
              //  System.out.println("El dia es: "+getFecha().getDayOfWeek());
                i++; 
            }
        }while(i<dias);
       // System.out.println("El dia final es "+getFecha().toString());      
        x=new Date(getFecha().toDate().getTime());
        
        return x;
    }
    
    public Date resta_diaslaborales(Date f, int dias) { 
        Date x;
        setFecha(new DateTime(f));
        int i=1;
        do{
            setFecha(getFecha().minusDays(1));
            if(getFecha().getDayOfWeek()==6 || getFecha().getDayOfWeek()==7){
              //  System.out.println("El valor es" +i);
            }
            else{ 
                //System.out.println("El dia es: "+fecha.getDayOfWeek());
                i++; 
            }
        }while(i<dias);
      //  System.out.println("El dia final es "+getFecha().toString());      
        x=new Date(getFecha().toDate().getTime());
        
        return x;
    }
    
    
    public static void formarcalendario(int año,int dir,int col,int tac,int p5,int p10,int u15){
        ComparadorFechas c= new ComparadorFechas();
        Date pEnero=new Date(año-1900, 0, 1);
        Date uMarzo=new Date(año-1900,2,31);
        Date pAbril=new Date(año-1900,3,1); 
        Date uJunio=new Date(año-1900,5,30);
        Date pJulio=new Date(año-1900,6,1);
        Date uSeptiembre=new Date(año-1900,8,30);
        Date pOctubre=new Date(año-1900,9,1);
        Date uDiciembre=new Date(año-1900,11,31);
        Date finaliza=new Date(año-1899,0,1);
        //System.out.println(finaliza.toString());
        String[]n=Seleccion.configuracion();
        if(n[1]==null){
        ListaNodos.agregainsert("enero5", c.suma_diaslaborales(pEnero, p5));
        ListaNodos.agregainsert("enero10", c.suma_diaslaborales(pEnero, p10));
        ListaNodos.agregainsert("abril5", c.suma_diaslaborales(pAbril, p5));
        ListaNodos.agregainsert("abril10", c.suma_diaslaborales(pAbril, p10));
        ListaNodos.agregainsert("julio5", c.suma_diaslaborales(pJulio, p5));
        ListaNodos.agregainsert("julio10", c.suma_diaslaborales(pJulio, p10));
        ListaNodos.agregainsert("octubre5", c.suma_diaslaborales(pOctubre, p5));
        ListaNodos.agregainsert("octubre10", c.suma_diaslaborales(pOctubre, p10));
        ListaNodos.agregainsert("marzo", c.resta_diaslaborales(uMarzo, u15));
        ListaNodos.agregainsert("junio", c.resta_diaslaborales(uJunio, u15));
        ListaNodos.agregainsert("septiembre", c.resta_diaslaborales(uSeptiembre, u15));
        ListaNodos.agregainsert("diciembre", c.resta_diaslaborales(uDiciembre, u15));
        ListaNodos.agregainsert("objcol", col);
        ListaNodos.agregainsert("objdir", dir);
        ListaNodos.agregainsert("tacticas", tac);
        ListaNodos.agregainsert("ano", año);
        ListaNodos.agregainsert("fin", finaliza);
        ListaNodos.agregainsert("comienzo", c.resta_diaslaborales(pEnero, u15));
        in.insertanuevo(ListaNodos.conversion_inser(), "configuracion");
        ListaNodos.borradoinser();
        System.gc();
        }else{
        ListaNodos.agregacam("enero5", c.suma_diaslaborales(pEnero, 5));
        ListaNodos.agregacam("enero10", c.suma_diaslaborales(pEnero, 10));
        ListaNodos.agregacam("abril5", c.suma_diaslaborales(pAbril, 5));
        ListaNodos.agregacam("abril10", c.suma_diaslaborales(pAbril, 10));
        ListaNodos.agregacam("julio5", c.suma_diaslaborales(pJulio, 5));
        ListaNodos.agregacam("julio10", c.suma_diaslaborales(pJulio, 10));
        ListaNodos.agregacam("octubre5", c.suma_diaslaborales(pOctubre, 5));
        ListaNodos.agregacam("octubre10", c.suma_diaslaborales(pOctubre, 10));
        ListaNodos.agregacam("marzo", c.resta_diaslaborales(uMarzo, 15));
        ListaNodos.agregacam("junio", c.resta_diaslaborales(uJunio, 15));
        ListaNodos.agregacam("septiembre", c.resta_diaslaborales(uSeptiembre, 15));
        ListaNodos.agregacam("diciembre", c.resta_diaslaborales(uDiciembre, 15));
        ListaNodos.agregacam("objcol", col);
        ListaNodos.agregacam("objdir", dir);
        ListaNodos.agregacam("tacticas", tac);
        ListaNodos.agregacam("ano", año);
        ListaNodos.agregacam("fin", finaliza);
        ListaNodos.agregacam("comienzo", c.resta_diaslaborales(pEnero, u15));
        ca.actualiza(ListaNodos.conversion_upd(), "configuracion");
        ListaNodos.borradoact();
        System.gc();
        }        
    }
    public Date suma_meses(Date f, int meses) {
        Date x;
        setFecha(new DateTime(f));
        setFecha(getFecha().plusMonths(meses));
        x=new Date(getFecha().toDate().getTime());
        //x = new Date(fecha.getYear(), fecha.getMonthOfYear(), fecha.getDayOfMonth());
        return x;
    }

    public Date suma_unaño(Date f) {
        Date x;
        setFecha(new DateTime(f));
        setFecha(getFecha().plusYears(1));
        x=new Date(getFecha().toDate().getTime());
      //  x = new Date(fecha.getYear(), fecha.getMonthOfYear(), fecha.getDayOfMonth());
        return x;
    }

    public static java.util.Date conversor(java.sql.Date fecha) {
        java.util.Date date = new java.util.Date(fecha.getTime());
        return date;
    }

    /**
     * @return the fecha
     */
    public DateTime getFecha() {
        return fecha;
    }

    /**
     * @param fecha the fecha to set
     */
    public void setFecha(DateTime fecha) {
        this.fecha = fecha;
    }

    /**
     * @return the estatica
     */
    public DateTime getEstatica() {
        return estatica;
    }

    /**
     * @param estatica the estatica to set
     */
    public void setEstatica(DateTime estatica) {
        this.estatica = estatica;
    }
}
